home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / program / asm32.zip / E32.ZIP / SAVE.ASM < prev    next >
Assembly Source File  |  1994-04-27  |  4KB  |  176 lines

  1. ; SAVE.ASM for E32 - Copyright (C) 1994 Douglas Herr
  2. ;  all rights reserved
  3.  
  4. ; this prompts for a file name then writes the file.
  5. ; The original file is renamed to filename.BAK.  If an
  6. ; invalid filename is entered, the speaker is beeped.
  7.  
  8. include    model.inc
  9.  
  10. public    save
  11. extrn    edit_filename:near
  12. extrn    working:near
  13. extrn    msave:near
  14. extrn    error:near
  15. extrn    yesno_message:near
  16. extrn    mark:near
  17.  
  18. extrn    dotbak:near
  19. extrn    qfname:near
  20. extrn    fexist:near
  21. extrn    disksize:near
  22.  
  23. temp_filename    equ    [ebp-64]
  24. save_start    equ    [ebp-68]
  25. save_bytes    equ    [ebp-72]
  26. cleanup        equ    dword ptr [ebp-76]
  27.  
  28. include    dataseg.inc
  29. save_mess    db 'Save as: ',0
  30. save_block_mess    db 'Save block as: ',0
  31. not_enough    db 'Not enough disk space'
  32. delete        db 0
  33.         db ' delete backup file (Y/N)?',0
  34. extrn    filename:dword        ; pointer to filename
  35. extrn    filesiz:dword
  36. extrn    dirty_bits:byte
  37. extrn    warning:byte
  38. extrn    mark_mode:byte, mark_start:dword, mark_end:dword
  39. @curseg    ends
  40.  
  41. include    codeseg.inc
  42. save    proc    near
  43.     enter    76,0
  44.  
  45.     xor    eax,eax
  46.     mov    save_start,eax
  47.     mov    delete,al
  48.     mov    eax,filesiz
  49.     mov    save_bytes,eax
  50.     mov    cleanup,offset save_new_filename
  51.  
  52. prompt_for_filename:
  53.     mov    esi,filename    ; pointer to filename
  54.  
  55. ; copy filename to temporary buffer
  56. s0:
  57.     lea    edi,temp_filename
  58.     push    ss
  59.     pop    es
  60.     mov    ecx,64/4
  61.     rep    movsd
  62.  
  63.     mov    esi,offset save_mess
  64.     cmp    mark_mode,0
  65.     je    short s2
  66.     mov    eax,mark_start
  67.     mov    ebx,mark_end
  68.     cmp    eax,ebx
  69.     je    short s2
  70.     jb    short s1
  71.     xchg    eax,ebx
  72. s1:
  73.     sub    ebx,eax
  74.     mov    save_start,eax
  75.     mov    save_bytes,ebx
  76.     mov    esi,offset save_block_mess
  77.     mov    cleanup,offset mark
  78.     mov    byte ptr temp_filename,0
  79. s2:
  80.     mov    ecx,63
  81.     call    edit_filename
  82.     cmp    ax,27
  83.     je    bad_exit
  84.  
  85. got_name:
  86.     mov    edx,esi        ; point EDX to the filename
  87.     mov    ax,4300h    ; get the file attributes
  88.     int    21h
  89.     jnc    short name_ok    ; if no error, filename ok
  90.     cmp    ax,3        ; was path not found error?
  91.     jne    short name_ok
  92.  
  93.     mov    ax,0E07h    ; write a bell character
  94.     int    10h        ; BIOS tty service
  95.     jmp    s0        ; try again
  96.  
  97. name_ok:
  98.     call    working        ; print 'Working' message
  99.     mov    ebx,esi
  100.     call    qfname
  101.     mov    edi,ebx
  102.     push    ds
  103.     pop    es
  104.     cld
  105.     rep    movsb        ; copy qualified filename to buffer
  106.  
  107. check_disk_space:
  108.     mov    dl,[ebx]    ; get drivespec
  109.     and    dl,0FFh-32    ; make it upper case
  110.     sub    dl,'A'        ; normalize
  111.     call    disksize
  112.     cmp    edx,save_bytes
  113.     jae    short s4
  114.  
  115. ; insufficient disk space
  116. ; see if an old file w/ same name is on the disk
  117. ; & prompt for deletion if so
  118.     mov    delete,':'    ; default: existing file w/same name
  119.     mov    edx,ebx        ; DS:[EDX] -> filename
  120.     call    fexist
  121.     cmc            ; CF = 1 if existing file
  122.     sbb    eax,eax        ; AX = 0FFFFh if file exists
  123.     and    delete,al    ; 'delete' = 0 if no existing file
  124.     lea    edx,not_enough
  125.     jz    short print_msg
  126.     mov    ah,warning
  127.     mov    esi,edx
  128.     call    yesno_message
  129.     cmp    al,'Y'        ; delete original file?
  130.     je    short s3
  131.     jmp    prompt_for_filename
  132. s3:    mov    edx,filename
  133.     mov    ah,41h
  134.     int    21h
  135.     call    working
  136.     mov    ebx,filename    ; DS:[EBX] -> filename
  137.     jmp    check_disk_space
  138.  
  139. print_msg:
  140.     call    error
  141.     jmp    prompt_for_filename
  142.  
  143. s4:    lea    edx,temp_filename
  144.     mov    esi,ebx
  145.     call    dotbak        ; rename original to .BAK
  146.     mov    eax,save_bytes
  147.     push    fs
  148.     pop    es
  149.     mov    ebx,save_start
  150.     call    msave
  151.     jc    short bad_exit    ; don't save new filename if error
  152.  
  153. ; clean up & return to ready mode
  154.     call    cleanup        ; save filename if not marked block
  155.                 ;  else unmark
  156. bad_exit:
  157.     clc
  158.     leave
  159.     ret
  160.  
  161. save    endp
  162.  
  163. save_new_filename:
  164.     push    ds
  165.     pop    es
  166.     lea    esi,temp_filename
  167.     mov    edi,filename
  168.     mov    ecx,64/4
  169.     rep    movsd
  170.     and    dirty_bits,00111111b
  171.     or    dirty_bits,00100000b
  172.     ret
  173.  
  174. @curseg    ends
  175.     end
  176.